package com.jnc.web.biz.system.controller;

import com.jnc.common.base.BaseResp;
import com.jnc.core.base.controller.BaseController;
import com.jnc.core.base.model.Menu;
import com.jnc.core.base.service.MenuService;
import com.jnc.core.config.shiro.util.ShiroUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @Author: jjn
 * @Date: 2018/9/18
 * @Desc:
 */
@Slf4j
@Controller
@RequestMapping("/system/menu")
public class MenuController extends BaseController {
    private String prefix = "system/menu";

    @Autowired
    private MenuService menuService;

    /**
     * 初始化展示页面
     * @return
     */
    @RequiresPermissions("system:menu:view")
    @GetMapping()
    public String init(){
        return prefix + "/list";
    }

    /**
     * 初始化新增页面
     * @param parentId
     * @param model
     * @return
     */
    @GetMapping("/addInit/{parentId}")
    public String addInit(@PathVariable("parentId") Integer parentId, ModelMap model){
        Menu menu = null;
        if(parentId != 0){
            menu = menuService.getMenu(parentId);
        }else{
            menu = new Menu();
            menu.setMenuId(0);
            menu.setMenuName("主目录");
        }
        model.put("menu", menu);
        return prefix + "/add";
    }

    /**
     * 初始化编辑页面
     * @param menuId
     * @param model
     * @return
     */
    @GetMapping("/editInit/{menuId}")
    public String editInit(@PathVariable("menuId") Integer menuId, ModelMap model){
        model.put("menu", menuService.getMenu(menuId));
        return prefix + "/edit";
    }

    /**
     * 选择菜单图标
     */
    @GetMapping("/icon")
    public String icon()
    {
        return prefix + "/icon";
    }

    /**
     * 查询列表数据
     * @param menu
     * @return
     */
    @RequiresPermissions("system:menu:list")
    @GetMapping("/list")
    @ResponseBody
    public List<Menu> list(Menu menu){
        log.debug("MenuController.list.menu : {}", menu);
        List<Menu> list = menuService.queryMenu(menu);
        return list;
    }

    /**
     * 新增
     * @param menu
     * @return
     */
    @RequiresPermissions("system:menu:add")
    @PostMapping("/add")
    @ResponseBody
    public BaseResp add(@RequestBody Menu menu){
        log.debug("MenuController.add.menu : {}", menu);
        //校验菜单名是否已存在
        List<Menu> list = menuService.checkMenu(menu);
        if(list != null && list.size() > 0){
            return error("该菜单名已存在");
        }
        //清除权限缓存
        ShiroUtil.clearCachedAuthorizationInfo();
        return toAjax(menuService.addMenu(menu));
    }

    /**
     * 编辑
     * @param menu
     * @return
     */
    @RequiresPermissions("system:menu:edit")
    @PostMapping("/edit")
    @ResponseBody
    public BaseResp edit(@RequestBody Menu menu){
        log.debug("MenuController.edit.menu : {}", menu);
        //校验菜单名是否已存在
        List<Menu> list = menuService.checkMenu(menu);
        if(list != null && list.size() > 0){
            return error("该菜单名已存在");
        }
        //清除权限缓存
        ShiroUtil.clearCachedAuthorizationInfo();
        return toAjax(menuService.editMenu(menu));
    }

    /**
     * 删除
     * @param menuId
     * @return
     */
    @RequiresPermissions("system:menu:remove")
    @PostMapping("/remove/{menuId}")
    @ResponseBody
    public BaseResp remove(@PathVariable("menuId") Integer menuId){
        //校验该菜单是否存在子菜单
        Integer count = menuService.getChildrenMenuCount(menuId);
        if(count != null && count > 0){
            return error("该菜单存在子菜单，不允许删除");
        }
        //清除权限缓存
        ShiroUtil.clearCachedAuthorizationInfo();
        return toAjax(menuService.deleteMenu(menuId));
    }

    /**
     * 获取菜单树信息
     * @param menuId
     * @param model
     * @return
     */
    @GetMapping("/getMenuTree/{menuId}")
    public String getMenuTree(@PathVariable("menuId") Integer menuId, ModelMap model){
        model.put("menu", menuService.getMenu(menuId));
        return prefix + "/tree";
    }

    /**
     * 加载所有菜单树列表
     * @return
     */
    @GetMapping("/menuTreeData")
    @ResponseBody
    public List<Map<String, Object>> menuTreeData(){
        return menuService.menuTreeData();
    }


    /**
     * 根据角色，加载菜单树列表
     * @return
     */
    @GetMapping("/roleMenuTreeData")
    @ResponseBody
    public List<Map<String, Object>> roleMenuTreeData(Integer roleId){
        return menuService.roleMenuTreeData(roleId);
    }
}
